package com.quanyan.club.service;

import com.quanyan.api.APIResponse;
import com.quanyan.club.entity.*;
import com.quanyan.club.entity.vo.resp.MyNewestClubCard;
import com.quanyan.club.entity.RespPlaceClubInfo;
import com.quanyan.club.entity.vo.resp.RespSearchActivity;
import com.quanyan.common.Plugin.PageObj;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;


/**
 * 俱乐部对外公开Service信息
 * Created by zhang on 16/5/31.
 */

public interface ClubOpenService {

    APIResponse<PageObj<List<RespSearchActivity>>> queryActivityListByCondition(Integer uid, double lat, double lng, int pageNum, int pageSize);

    PageObj<List<RespClubActivity>> latestActivityList4Place(Integer placeId, Integer pageNum, Integer pageSize);
    /**
     * 判断用户是否为某俱乐部成员
     * @param clubId
     * @param uid
     * @return
     */
    RespIsClubMember isClubMember(int clubId, int uid);

    /**
     * 是否是加入了某个运动类型的俱乐部
     * @param uid               用户uid
     * @param sportTypeId       运动类型id
     * @return
     */
    boolean isSportClubMember(int uid, int sportTypeId);

    /**
     * 是否是某种运动类型俱乐部的管理员
     * @param uid
     * @param sportTypeId
     * @return
     */
    boolean isSportClubAdmin(int uid, int sportTypeId);

    /**
     * 获取某用户加入的指定类型的俱乐部
     * @param uid
     * @param sportTypeId
     * @return
     */
    List<RespClubBaseInfo> getSportClubsOfAdmin(int uid, int sportTypeId);

    /**
     * 获取是某种运动类型俱乐部的管理员身份的所有俱乐部id
     * @param uid
     * @param sportTypeId
     * @return
     */
    List<Integer> getSportClubIdsOfAdmin(int uid, int sportTypeId);

    /**
     * 获取俱乐部成员列表
     * @param clubId        俱乐部id
     * @param isTeamMember  是否包含俱乐部代表队成员
     * @return
     */
    List<RespClubMemberBaseInfo> getClubMembers(int clubId, boolean isTeamMember);

    /**
     * 获取俱乐部的主席和普通管理员（不包含财务管理员）
     */
    List<RespClubMemberBaseInfo> getClubAdmins(int clubId);

    /**
     * 判断该成员在俱乐部中是否存在未读通告
     * @param clubId
     * @param uid
     * @return
     */
    boolean isHaveNotReadAnnouncement(int clubId,int uid);

    /**
     * 获取俱乐部常驻球馆信息
     * @param clubId
     * @return
     */
    RespClubResidentPlace getClubResidentPlace(int clubId);

    /**
     * 获取用户所属俱乐部信息
     * @param uid
     * @return
     */
    List<RespClubOpenInfo> getUserClubInfoList(int uid);


    /**
     * 获取俱乐部成员的线上线下资金
     * @param uid       俱乐部成员用户id
     * @param clubId    俱乐部id
     * @return
     */
    RespClubMemberFund getClubMemberFund(int uid, int clubId);


    /**
     * 获取pk俱乐部
     * @param cityId        城市id
     * @param sportType     俱乐部运动类型
     * @param pageNum       页码
     * @param pageSize      每页记录条数
     * @return
     */
    PageObj<List<RespClubBaseInfo>> getPKClubs(Integer cityId, Integer sportType, @NotNull Integer pageNum, @NotNull Integer pageSize);

    /**
     * 根据俱乐部名称关键字，搜索出俱乐部信息
     * @param nameKeyword       俱乐部名称关键字
     * @return
     */
    PageObj<List<RespClubBaseInfo>> getClubByName(String nameKeyword, List<Integer> sportTypeIds, Integer cityId, Integer districtId, @NotNull Integer pageNum, @NotNull Integer pageSize);

    /**
     * 推荐俱乐部
     * @param residentPlaceId 常驻球馆id
     * @param sportType        俱乐部类型id
     * @return
     */
    PageObj<List<RespClubRecommendInfo>> getRecommendClubs(Integer residentPlaceId, Integer sportType, Integer pageNum, Integer pageSize);

    /**
     * 批量获取俱乐部简要信息
     * @param clubIds           俱乐部id列表
     * @return  clubId:clubPlainInfo
     */
    Map<Integer, RespClubPlainInfo> getClubBaseInfoList(List<Integer> clubIds);

    /**
     * 根据用户id，获取此用户加入的，创建的俱乐部简要信息
     * @param uid       用户id
     * @return
     */
    List<RespClubBaseInfo> getClubBaseInfoByUserId(Integer uid);

    /**
     * 批量获取俱乐部代表队成员的id
     * @param clubIds           俱乐部id列表
     * @return
     */
    Map<Integer, List<Integer>> getClubsTeamMembersId(List<Integer> clubIds);

    /**
     * 根据uid，获取此用户在俱乐部中身份为代表队员/管理员/主席的俱乐部id
     * @param uid           用户id
     * @return
     */
    List<Integer> getClubIds(Integer uid);

    /**
     * 获取我加入的(包括我创建的)某种运动类型的俱乐部
     * @param uid           用户id
     * @param sportTypeId   俱乐部运动类型id
     * @return
     */
    List<Integer> getClubIds(Integer uid, Integer sportTypeId);

    /** 给俱乐部线上账户充值或者扣费
     *
     * @param clubId            俱乐部id
     * @param tradeNo           交易号，订单号，活动编号
     * @param fee               金额
     * @param incr              true 充值，false 扣除
     * @param remark            备注
     *
     */
    APIResponse updateClubOnlineAccountBalance(Integer clubId, Integer activityId, String tradeNo,
                                               BigDecimal fee, String remark, boolean incr);


    /**
     * 立即结算到俱乐部资金
     * @return
     */
    APIResponse settlementClubGameActivity(ReqClubSettlementInfo settlementInfo, List<ReqClubSettlementInfo> userSettlementInfos);

    /**
     * 增加或扣除俱乐部成员账户余额
     *
     * @param clubId        俱乐部id
     * @param  userId       俱乐部成员用户id
     * @param fee           金额
     * @param incr         是否添加 true为增加 false为扣除
     */
    APIResponse updateClubMemmberOnlineAccountBalance(Integer clubId, Integer userId, BigDecimal fee, boolean incr);

    /**
     * 推荐最新的活动信息
     * @return
     */
    RespLatesActivityInfo latestActivityListForPage(Integer pageNum,Integer pageSize);

    /**
     * 根据场馆推荐活动信息
     * @param placeId
     * @return
     */
    RespLatesActivityInfo latestActivityInfo(Integer placeId,Integer uid, Integer categoryId);

    /**
     * 根据活动idList 查询活动列表
     * @param activityIdList
     * @return
     */
    List<RespClubActivity> batchQueryActivityList(List<Integer> activityIdList);

    /**
     * 获取我加入的我传教的俱乐部中，排名最大的名次
     * @param uid
     * @return
     */
    int getMaxRankingOfMyClubs(int uid);

    /**
     * 获取我加入的我传教的俱乐部中，排名最大的名次
     * @param uid
     * @return
     */
    int getMaxRankingOfMyClubs(int uid, int sportTypeId);

    /**
     * 我创建的俱乐部列表信息
     * @param uid
     * @return
     */
    List<RespClubOpenInfo> getMyManageClubList(int uid);


    /**
     * 获取我管理的俱乐部列表
     */
    List<RespClubPlainInfo> getMyManageClubs(int uid);

    /**
     * 我加入的俱乐部列表信息
     * @param uid
     * @return
     */
    List<RespClubOpenInfo> getMyJoinClubList(int uid);

    /**
     * 我创建的俱乐部总数
     * @param uid
     * @return
     */
    int getMyManageClubCount(int uid);

    /**
     * 我加入的俱乐部总数
     * @param uid
     * @return
     */
    int getMyJoinClubCount(int uid);

    PageObj<List<RespClubActivity>> selectActivityRecommend(Integer cityId, Integer categoryId, Integer  pageNum, Integer pageSize);

    /**
     * 申请加入俱乐部
     * @param uid       申请加入人的uid
     * @param clubId    申请加入的俱乐部
     * @param remark    备注
     * @return
     */
    APIResponse applyJoinClub(int uid, int clubId, String remark, int larkAppId);

    /**
     * 搜索俱乐部成员
     * @param clubId
     * @param keyword
     * @return
     */
    List<RespClubMember> searchClubMember(int clubId, String keyword);


    /**
     * 根据活动id查询活动详情
     * @param reqClubMovements
     * @return
     */
    APIResponse<List<RespClubMovement>> searchClubMovmentToUserModele(List<ReqClubMovement> reqClubMovements);


    /**
     * 个人中心页面，我最新的俱乐部卡片信息
     * @param uid
     * @return
     */
    MyNewestClubCard getMyNewestClub(int uid);

    /**
     * 个人中心页面，我报名的最近开始的活动
     * @param uid
     * @return
     */
    RespMyLastActivity getMyLastActivity(int uid);

    Map<Integer,List<RespPlaceClubInfo>> selectClubByPlaceIds(List<Integer> placeIds,
                                                              int pageNum, int pageSize, int categoryId);

    Map<Integer,List<RespPlaceClubInfo>> selectActivityByPlaceIds(List<Integer> placeIds,
                                                                  int pageNum, int pageSize, int categoryId);

    APIResponse<PageObj<List<RespSearchActivity>>> queryPlaceActivityBySolr(
            double lat,double lng,double distance,int categoryId,int pageSize);

    /**
     * 俱乐部推荐
     * @param clubTypeId    栏目id
     * @param lat           纬度
     * @param lng           经度
     * @param raduis        搜索半径
     * @param size          返回俱乐部个数
     *                      @param soryBy 5 按距离排序 6 综合排序
     * @return
     */
    List<RespClubBaseInfo> clubRecommendBasePOI(int uid, int clubTypeId, double lat, double lng, double raduis, int size, int soryBy);


    List<RespSearchActivity> selectActivityByClub(double lat, double lng, int clubId, int pageSize);

    RespMyLastActivity getMyClubActivity(int uid);

    Map<Integer, List<Integer>> queryActivityWeekByClubs(List<Integer> clubIds);
}
